import langpipe
import json
import sample_nodes

# parameters description
params_desc = """
{
  "时间": "打电话的电话时间",
  "上报人": "打电话报警的人、组织或者一个代称（可以从上下文中获取或推断得出）",
  "接收人": "接听电话的人或组织",
  "事发高速": "事件发生的高速名称，比如'沪蓉高速'、'武黄高速'",
  "事发位置": "事件发生的位置，比如'K720+100'、'快到葛店的位置'、'武汉西收费站'",
  "事发方向": "事件发生的方向，比如'黄石方向'",
  "事件名称": "归纳事件发生的类型，用一个名词表示，比如'停车'",
  "事件描述": "详细的事件细节描述，比如'应急车道发现一辆车撞击护栏，车辆损坏严重，有人员伤亡'，事件描述过程不要使用第一人称，且不要使用带有情绪语气和标点"
}
"""

# aggregation description
aggregate_desc = """
请根据可用信息，生成一个对外发布的正式通告。
下面是一则具体的通告示例可供参考：
-------
您好，这里是【具体的接收人】，
2024年10月31日17:07接【具体的上报人】上报：徐广高速429公里广州方向，发现散落物，有很多散落的衣物等垃圾在路面上，请前往处理。
-------
"""

# test query1
query = """
（2025年4月3日 14:32:34）
（电话接通，背景音中有刺耳的刹车声和金属撞击声）
"122报警中心，请讲！"
（急促喘息声）"出...出大事了！连环撞车了！"
"先生您别急，先说下您是否安全？"
"我...我没事！但这边撞了好多车！"
"您是路过的司机吗？"
"是的"
"能告诉我您现在的大概位置吗？"
"在高速上！这边雾特别大...刚才突然看到前面刹车灯全亮..."
"具体是哪条高速？往哪个方向？"
"呃...好像是G15...往...往上海方向！"
"好的G15沈海高速。看到最近的里程牌了吗？"
（稍作停顿）"等等...K1372！就在这个位置！"
"现场有多少辆车相撞？有人员受伤吗？"
"数不清...至少七八辆！有辆小车被夹在中间变形了，里面的人在喊救命！"
"请先确保自身安全！看到冒烟或者漏油的情况吗？"
"有辆SUV在冒烟...天啊！后面还有车在往这边冲！"
"所有人员立即撤离到护栏外！已经通知交警和救护车。您车牌号是多少？"
"浙B·5R668！警察同志你们快来吧，这边雾越来越大！"
"救援已在路上。请协助提醒后方车辆减速！"
"明白！我在拼命挥手...啊！又撞上了！"
"您先退到安全区域！我们正在通过电子屏发布预警。"
"好好...我已经退到护栏外了...那边有个人满脸是血..."
"救护车5分钟就到。还有其他危险情况吗？"
"有辆货车拉的钢卷...现在歪在路边，随时可能翻！"
"请远离那辆货车！所有人员继续后撤！"
（警笛声渐近）
"太好了！我看到警车了！"
"请配合民警指挥，注意安全！"
（电话挂断）
"""

# test query2
query2 = """
（2025年4月3日 14:32:34）
**（电话接通，背景音有急促的雨声和车辆鸣笛声）**
"高速交警指挥中心，请讲！"
（语气慌张，夹杂着雨刮器的声音）"喂喂！出大事了！我在G65包茂高速重庆段，往湖南方向，刚过黑水收费站！前面山体滑坡了！"
"请保持冷静！具体在哪个位置？有没有车辆受损？"
"就在K1287附近！我看到好几块大石头从山上滚下来，直接把超车道和行车道都堵死了！有辆小车差点被砸中！"
"现场有没有人员受伤？您的车辆现在是否安全？"
"我急刹车停住了！那辆小车司机好像吓懵了，但人应该没事...现在后面已经堵了十几辆车了！雨太大了，山上还在往下掉碎石！"
"请立即开启危险报警闪光灯！所有人员马上撤离到护栏外侧！我们已经通知路政和救援单位。"
"明白！我正在招呼其他司机往后撤...天呐！又有一块大石头滚下来了！"
"请务必注意安全！您能看到滑坡的具体范围吗？"
"至少两百米的路面都被埋了！现在完全过不去了！我的车牌是渝A·D5678，后面已经排起长队了！"
"好的，我们已调取监控确认位置。请协助维持现场秩序，提醒后方车辆打开双闪，保持安全距离！"
"知道了！你们快点来啊！这雨越下越大，我担心还会继续塌方！"
"抢险队伍已在路上，预计20分钟到达。请您和其他司乘人员务必待在安全区域！"
"好好好！我们都在护栏外面等着...哎哟小心！又有碎石掉下来了！"
"保持电话畅通，注意观察周边情况，随时与我们保持联系！"
**（电话挂断，背景音中仍能听到急促的雨声和零星的落石声）**
"""

# test query3
query3 = """
**（电话接通）**  
"您好，这里是高速交警指挥中心，请问发生什么事了？"  
（喘着气，背景有高速车流声）"警察同志！我在G42沪蓉高速上，往南京方向，刚过服务区没多远，我车被追尾了！"  
"人有没有受伤？车辆还能移动吗？"  
"我人没事，但后车撞得挺狠，安全气囊都弹出来了！我车还能动，但不敢乱开啊，现在都停应急车道了。"  
"好的，请立即打开双闪灯，在车后150米放三角警示牌！车上人员全部撤到护栏外面，不要待在车里！"  
"好好好，我马上去放牌子！哎哟，这后头车开得飞快，吓死人了！"  
"别慌，我们已经通知巡逻车过去，大概10分钟到。您的具体位置是G42沪蓉高速多少公里处？"  
"呃...我刚过XX服务区，大概...呃...路牌写着‘K285’！"  
"明白，K285处，往南京方向。后车司机情况怎么样？"  
"他刚才下车了，看着有点懵，但人应该没事。警察同志，这责任怎么算啊？是他追尾我..."  
"先别讨论责任，安全第一！你们俩都退到护栏外，等我们民警到了处理。车牌号报一下。"  
"我的是苏A·5678，后车是浙B·1234。"  
"好的，保持电话畅通，注意安全，我们马上到。"  
"行行行，你们快点啊！这高速上太危险了！"  
**（电话挂断）**
"""

# create nodes
begin = langpipe.LPBegin('begin_node')
extractor = langpipe.LPExtractor('extractor', json.loads(params_desc), 'qwen2.5:32b')
aggregator = langpipe.LPAggregator('aggregator', aggregate_desc, 'qwen2.5:32b')
end = langpipe.LPEnd('end_node')

# link together
begin.link(extractor)
extractor.link(aggregator)
aggregator.link(end)

# input with async mode
begin.input(query3, None, False)

# visualize pipeline for debug purpose
renderer = langpipe.LPBoardRender(node_size=100)
renderer.render(begin)
